/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package unidadeMedida;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;
import util.ErroAcessoRepositorioException;
import util.HibernateUtil;

/**
 *
 * @author PauloM
 */
public class RepositorioUnidadeMedida {

    private static final String MSG_ERRO_ACESSO_BD = "Erro de acesso ao banco de dados";

    /**
     *
     * @param objUnidadeMedida
     * @throws ErroAcessoRepositorioException
     */
    public void cadastrarAtualizar(UnidadeMedida objUnidadeMedida) throws ErroAcessoRepositorioException {
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = (Transaction) s.beginTransaction();
            s.saveOrUpdate(objUnidadeMedida);
            // Comitando tudo caso der certo
            t.commit();
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
    }

    /**
     * Metodo que ira produrar a UnidadeMedida
     *
     * @param int idUnidadeMedida
     * @return void
     */
    public UnidadeMedida procurar(int idUnidadeMedida) throws UnidadeMedidaNaoCadastradoException, ErroAcessoRepositorioException {
        UnidadeMedida objUnidadeMedida = null;
        if (this.existe(idUnidadeMedida)) {
            Session s = null;
            Transaction t = null;
            try {
                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = (Transaction) s.beginTransaction();
                // Salvando a UnidadeMedida no banco
                objUnidadeMedida = (UnidadeMedida) s.get(UnidadeMedida.class, idUnidadeMedida);
                // Comitando tudo caso der certo
                t.commit();
            } catch (Exception e) {
                //t.rollback();
                throw new UnidadeMedidaNaoCadastradoException();
            }
        } else {
            throw new UnidadeMedidaNaoCadastradoException("Unidade de Medida Não Cadastrado");
        }
        return objUnidadeMedida;
    }

    /**
     * Metodo que ira verificar a existência a UnidadeMedida
     *
     * @param int idUnidadeMedida
     * @return void
     */
    public boolean existe(int idUnidadeMedida) throws ErroAcessoRepositorioException {
        UnidadeMedida objUnidadeMedida = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = (Transaction) s.beginTransaction();
            // Salvando a UnidadeMedida no banco
            objUnidadeMedida = (UnidadeMedida) s.get(UnidadeMedida.class, idUnidadeMedida);
        } catch (Exception e) {
            t.rollback();
        }
        return (objUnidadeMedida != null);
    }

    /**
     * Metodo que ira listar o UnidadeMedida
     *
     * @return Collection
     */
    public List<UnidadeMedida> listar(String strComplemento) throws Exception, ErroAcessoRepositorioException {
        List<UnidadeMedida> listUnidadeMedida = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = (Transaction) s.beginTransaction();
            Query q = (Query) s.createQuery("from UnidadeMedida " + strComplemento);
            listUnidadeMedida = q.list();
            t.commit();
        } catch (Exception e) {
            t.rollback();
            System.out.println(e.getMessage());
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
        }
        return listUnidadeMedida;
    }

    /**
     * Método que ira remover o UnidadeMedida do banco
     *
     * @param idUnidadeMedida
     */
    public void remover(int idUnidadeMedida) throws UnidadeMedidaNaoCadastradoException, ErroAcessoRepositorioException {
        UnidadeMedida objUnidadeMedida = null;
        if (this.existe(idUnidadeMedida)) {
            Session s = null;
            Transaction t = null;
            try {
                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = (Transaction) s.beginTransaction();
                // Recupero o meu UnidadeMedida
                objUnidadeMedida = (UnidadeMedida) s.get(UnidadeMedida.class, idUnidadeMedida);
                // Comintando
                t.commit();
                // Atualizo ele pra excluido
                this.cadastrarAtualizar(objUnidadeMedida);
            } catch (Exception e) {
                //t.rollback();
                //  this.objSession.close();
                throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
            }
            // this.objSession.close();
        } else {
            throw new UnidadeMedidaNaoCadastradoException();

        }
    }
}